home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / a_utils / perl / prlbkxmp.lha / ch6 / lastlogin < prev    next >
Text File  |  1991-01-08  |  3KB  |  102 lines

  1. #!/usr/bin/perl
  2.  
  3.     # A lastlog record format for use by pack and unpack.
  4.  
  5. $lastlog_t = "L a8 a16";        # (Your machine's may differ.)
  6.  
  7.     # Find the length of the fixed-length record.
  8.  
  9. $LEN = length(pack($lastlog_t, 0, '', ''));
  10.  
  11.     # Open the database of last logins.  Fixed length records.
  12.  
  13. open(LASTLOG, "/usr/adm/lastlog")
  14.     || die "Can't open lastlog file: $!\n";
  15.  
  16.     # Open the database of accounts.  Variable length records.
  17.  
  18. open(PASSWD, "/etc/passwd")
  19.     || die "Can't open passwd file: $!\n";
  20.  
  21.     # So we can look up month names later.
  22.  
  23. @month = (Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec);
  24.  
  25.     # Now we iterate through variable length records by using
  26.     # the <> input symbol.  In this particular database, the
  27.     # delimiter just happens to be \n.  How lucky can you get?
  28.  
  29. while ($varrec = <PASSWD>) {
  30.  
  31.     # And the field delimiter happens to be a colon.  Amazing!
  32.  
  33.     ($login, $pass, $uid, $gid, $gcos) = split(/:/, $varrec);
  34.  
  35.     # Extract name from gcos field portably.
  36.  
  37.     $fullname = $gcos;
  38.     $fullname =~ s/^[^,]*-(.*)\(.*/$1/ || $fullname =~ s/,.*//;
  39.     if ($fullname =~ /&/) {     # You don't want to know.
  40.     $name = $login;
  41.     substr($name,0,1) =~ tr/a-z/A-Z/;
  42.     $fullname =~ s/&/$name/;
  43.     }
  44.  
  45.     # Now we random access the lastlog database.  It's keyed
  46.     # by position based on the user id we want to look up.
  47.     # Note that we multiply by the record length, since Unix
  48.     # always wants byte offsets.
  49.  
  50.     seek(LASTLOG, $uid * $LEN, 0);
  51.     read(LASTLOG, $lastlog, $LEN);
  52.  
  53.     # Now that we've fetched the lastlog record, we can
  54.     # break it out into its fields.  Note that variable-
  55.     # length fields above are separated with the split
  56.     # operator, while these fixed-length fields are separated
  57.     # using unpack.
  58.  
  59.     ($time, $line, $host) = unpack($lastlog_t, $lastlog);
  60.  
  61.     # Now remember it so we can sort easily.
  62.  
  63.     push(@records, "$time:$login:$uid:$fullname");
  64. }
  65.  
  66.     # Now sort the records, oldest first.  See the
  67.     # "numerically" subroutine below.
  68.  
  69. @records = sort numerically @records;
  70.  
  71. foreach $record (@records) {
  72.     ($time,$login,$uid,$fullname) = split(/:/, $record);
  73.  
  74.     # Break out the login time, stored as seconds since
  75.     # January 1, 1970, into normal date numbers.
  76.  
  77.     if ($time) {
  78.     ($sec,$min,$hour,$mday,$mon,$year) = localtime($time);
  79.     $year += 1900;
  80.     $date = "$mday $month[$mon] $year";
  81.     }
  82.     else {
  83.     $date = "Never";
  84.     }
  85.  
  86.     # Write using the format below.
  87.  
  88.     write;
  89. }
  90.  
  91. sub numerically { $a <=> $b; }
  92.  
  93. format top =
  94.   Uid  Login    Full Name                         Last Login
  95.  
  96. .
  97.  
  98. format STDOUT =
  99. @>>>>  @<<<<<<< @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @||||||||||
  100. $uid,  $login,  $fullname,                        $date
  101. .
  102.